#include <stdio.h>
#include <stdlib.h>

typedef int DataType;

#define StackInitSize 100
#define StackIncrementSize 20

typedef struct seq_stack
{
    DataType *base;
    DataType *top;
    int stacksize;
} SeqStack;

// 构造一个空栈S
void InitStack(SeqStack *S)
{
    S->base = (DataType *)
      malloc(StackInitSize * sizeof(DataType));
    if (!S->base)
    {
        printf("内存空间分配失败 ! \n");
        exit(0);
    }
    S->top = S->base;
    S->stacksize = StackInitSize;
    printf("存储空间分配成功 ! \n");
}

// 判断一个栈是否为空
void StackEmpty(SeqStack S)
{
  if ((S.base != NULL) && (S.top != NULL))
  {
    if(S.base == S.top) 
      printf("栈为空 ! \n");
    else
      printf("栈不为空 ! \n");
  } 
}

// 入栈操作
void Push(SeqStack *S, DataType e)
{
    if (S->top - S->base >= S->stacksize)
    {
        S->base = (DataType *)realloc(S->base, (S->stacksize + StackIncrementSize) * sizeof(DataType));
        if (!S->base)
        {
            printf("内存空间分配失败 ! \n");
        }
        S->top = S->base + S->stacksize;
        S->stacksize += StackIncrementSize;
        printf("存储空间分配成功 ! \n");
    }
    *(S->top) = e;
    S->top++;
}

// 出栈操作
void Pop(SeqStack *S, DataType *e)
{
    if (S->top == S->base)
    {
        printf("栈为空 ! \n");
        return;
    }
    --(S->top);
    *e = *(S->top);
    printf("出栈成功");
}

// 销毁栈
void DestroyStack(SeqStack *S)
{
  if(S != NULL) 
  {
    free(S->base);
    S->base = NULL;
    S->top = NULL;
    S->stacksize = 0;
    printf("销毁栈成功 ! \n");
  }
}

// 求栈长
int StackLength(SeqStack S)
{
  if(S.base != NULL && S.top != NULL) 
  {
    return S.top - S.base;
  }
  return 0;
}


// 写一个 main 函数，对栈进行操作
int main()
{
  printf("%d\n%d\n", sizeof(SeqStack), sizeof(DataType));
  SeqStack S;
  InitStack(&S);
  Push(&S, 1);
  Push(&S, 0);
  Push(&S, 2);
  Push(&S, 4);
  DataType e;
  Pop(&S, &e);
  printf("出栈元素：%d\n", e);
  Pop(&S, &e);
  printf("出栈元素：%d\n", e);
  Pop(&S, &e);
  printf("出栈元素：%d\n", e);
  printf("栈的长度：%d\n", StackLength(S));
  DestroyStack(&S);
  printf("Enter any num to quit:");
  int i;
  scanf("%d", &i);
  return 0;
}